昨天將 ASP.NET Core Identity 加入到專案內了,而今天我們就要來看看,當初勾選的驗證功能,能不能正常運作。
因為 ASP.NET Core Identity 的程式是使用 RazorPage 來達成,所以也會講一下 RazorPage 的撰寫以及運作方式。
相信蠻多人有聽過 ASP.NET WebForm 這一個框架,如果你是讀高職資訊科,通常都學的程式語言有蠻大機率是 VB 的,而 ASP.NET WebForm 就是類似 VB 的程式框架。
它提供以拖曳元件的方式來組成頁面功能,不需要撰寫太多的 HTML 與 JS,即可與後端的 Function 進行互動,並且每一個 .aspx 頁面都有一個對應的 .aspx.cs 後端程式。
而 RazorPage 我認為可以當作是移除掉拖曳元件功能的 Webform,它一樣擁有一個頁面與一個後端程式對應的模式,只不過是從 .aspx, .aspx.cs 變成了 .cshtml, .cshtml.cs,簡單說就是變成使用 Razor 語法來開發前端網頁的部分。
如果你會撰寫 ASP.NET (Core) MVC,那麼 RazorPage 肯定也很快就可以上手,我們實際來看程式碼:
@page
@model IndexModel
@{
ViewData["Title"] = "Profile";
ViewData["ActivePage"] = ManageNavPages.Index;
}
<h3>@ViewData["Title"]</h3>
<partial name="_StatusMessage" for="StatusMessage" />
<div class="row">
<div class="col-md-6">
<form id="profile-form" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-floating">
<input asp-for="Username" class="form-control" disabled />
<label asp-for="Username" class="form-label"></label>
</div>
<div class="form-floating">
<input asp-for="Input.PhoneNumber" class="form-control" />
<label asp-for="Input.PhoneNumber" class="form-label"></label>
<span asp-validation-for="Input.PhoneNumber" class="text-danger"></span>
</div>
<button id="update-profile-button" type="submit" class="w-100 btn btn-lg btn-primary">Save</button>
</form>
</div>
</div>
@section Scripts {
<partial name="_ValidationScriptsPartial" />
}
這是 Identity 所產生的 Manage/Index.cshtml,其實就和撰寫 MVC 的 View 是一樣的,畢竟都是使用 Razor 語法,再來看看 .cshtml.cs
此為前半段的程式碼,可以看到有著建構子,也有注入 DI 的 Property,但截圖的下半部又像是 Model 的內容,其實 RazorPage 的頁面後端程式就是 Model 與 Controller 的結合,再往下看剩餘的程式碼:
.cshtml.cs 預設會擁有 OnGet, OnPost 的 Function,顧名思義就是執行 GET 或是 POST 的 HttpMethod,程式碼整體來看都算是好懂。
在 OnModelCreating()
加入 base.OnModelCreating(modelBuilder);
,再執行 dotnet ef migrations add
與 dotnet ef database update
,讓 EF Core 在 DB 建立 Identity 所需的 Table。
ConfigureServices
加入:
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
Configure
加入:
app.UseAuthentication();
在 UseEndpoints
新增 RazorPage 的服務:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
Identity 在 Shared 資料夾產生了 _LoginPartial.cshtml
這一個 PartialView,是讓畫面可以顯示註冊/登入的 Button。
在 _Layout.cshtml,navbar 的地方加入此 PartialView:
@await Html.PartialAsync("_LoginPartial")
右上角多了 PartialView 的註冊/登入按鈕,點擊註冊:
將欄位填寫並送出,畫面自動導向回首頁,右上角變成登入使用者的 Email Address 與登出 Button:
到 DB 查看 [AspNetUsers]
Table,也確實有新增帳號資料:
點擊 Email 後,會導向至後台功能頁面,類似會員中心:
可以看到左側選單就是當初選擇要導入的 Identity 服務:
點擊 Logout 也能正常登出,基本上 Identity 的功能都簡單測試完畢,並且是可以運作的。
今天將 ASP.NET Core Identity 相關的 Code 設定好,並實際測試了功能,明天會開始將驗證應用在活動舉辦/報名上,也應該算是要製作系統的核心商業邏輯。
那麼明天見了!
在 ASP.NET Core專案中新增 Identity 、下載和刪除自訂使用者資料
The entity type 'IdentityUserLogin' requires a primary key to be defined [duplicate]